#include <iostream>
#include "log4cpp/Category.hh"
#include "log4cpp/FileAppender.hh"
#include "log4cpp/PatternLayout.hh"
#include "log4cpp/OstreamAppender.hh"
#include "libgen.h"
using namespace log4cpp;
int main() {

    const std::string name ="root";
    const std::string fileName ="/tmp/test.log";
    /**
    * 日志输出格式：模式布局支持以下格式：
       %%- 一个百分号
       %c - 类别
       %d - 日期\n 日期格式：日期格式字符后可以跟一个日期格式说明符，括在大括号之间。例如，%d{%H：%M：%S，%l} 或 %d{%d %m %Y %H：%M：%S，%l}.如果未给出日期格式说明符，则使用以下格式：“星期三 Jan 02 02：03：55 1980”。日期格式说明符接受与 ANSI C 函数 strftime 相同的语法，但增加了 1。加法是表示毫秒的说明符 %l，用零填充以构成 3 位数字。
       %m - 消息
       %n - 特定于平台的行分隔符
       %p - 优先级
       %r - 自创建此布局以来的毫秒数。
       %R - 自 1970 年 1 月 1 日以来的秒数
       %u - 自进程启动以来的时钟周期
       %x - 国家自主贡献中心
       %t - 线程名称
       默认情况下，PatternLayout 的转换模式设置为“%m%n”。
    */
    const std::string pattern ="%d [%t] %p: %m%n";

    // 输出到控制台
    log4cpp::Appender * consoleLog = new log4cpp::OstreamAppender(name,&std::cout);
    // 输出到文件
    log4cpp::Appender * fileLog = new log4cpp::FileAppender("FileAppender",fileName);


     // 设置日志布局
    log4cpp::PatternLayout* pLayout = new log4cpp::PatternLayout();
    pLayout->setConversionPattern(pattern);
    // 应用布局
    fileLog->setLayout(pLayout);


    // 设置日志布局
    log4cpp::PatternLayout* consoleLayout = new log4cpp::PatternLayout();
    consoleLayout->setConversionPattern(pattern);
    consoleLog->setLayout(consoleLayout);

    // 设置日志级别
    log4cpp::Category& root =log4cpp::Category::getRoot();
    root.addAppender(consoleLog);
    root.addAppender(fileLog);

//  设置日志记录器的级别
    root.setPriority(log4cpp::Priority::INFO);
    // 打印日志
    root.info("Hello log4cpp in aError Message!");
    root.error("Hello log4cpp in aError Message!");
    root.warn("Hello log4cpp in aWarning Message!");
    root.debug("debug info:%d",998);

    root.info("遗憾的是，log4cpp不支持输出行号，若要输出行号和文件名可以这么做：文件名:%s, 行号:%d",basename(__FILE__),__LINE__);

    //清理资源
    log4cpp::Category::shutdown();




    return 0;
}
